package lambda05;

import org.junit.Test;

import java.util.function.Consumer;

/**
 * Consumer接口中的默认方法
 *   //当我们需要对同一个内容执行一个连续操作,可以使用andThen
 *   //同时也可以利用andThen完成链式编程
 *
 *
 *   default Consumer<T> andThen(Consumer<? super T> after) {
 *         Objects.requireNonNull(after);
 *         return (T t) -> { accept(t); after.accept(t); };
 *   }
 * 需求:要求首先打印一个字符串的长度,接着再去将这个字符串全部转换成大写后再打印
 */
public class ConsumerDemo02 {
	@Test
	public void test01() {
       method("abcd",
		       str-> System.out.println(str.length()),
		       str-> System.out.println(str.toUpperCase()));
	}

	public void method(String str, Consumer<String> c1,Consumer<String> c2) {
         /* c1.accept(str);
          c2.accept(str);*/
         c1.andThen(c2).accept(str);
	}
}
/*
* 1.c1.andThen(c2)
*
*  default Consumer<T> andThen(Consumer<? super T> after) {
          Objects.requireNonNull(after);//如果after为null,则抛空指针异常
          //return (T t) -> { this.accept(t); after.accept(t); };
          //return (String t)->{c1.accept(t);c2.accept(t);}
          //return new ConsumerDemo02$$Lambda$1();//返回一个Lambda表达式相当于返回该Lambda表达式对应的实现类对象
   }
*
*2. new ConsumerDemo02$$Lambda$1().accept("abcd")
*
*
*
*  //(String t)->{c1.accept(t);c2.accept(t);}该Lambda表达式对应实现类
* class ConsumerDemo02$$Lambda$1 implements Consumer<String>{
*     public void accept(String t){//String t="abcd"
*        c1.accept(t); //c1.accept("abcd");
*        c2.accept(t);//c2.accept("abcd")
*     }
* }
*
*
*
*/